{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**问题：**\n",
    "假设你正在为一个电影推荐系统设计一个简单的KNN算法。我们有以下一些用户的电影评分数据，数据由两个特征组成：用户对电影A和电影B的评分，分别在1-5之间。用户的标签（电影类型偏好）是动作片（标签0）或者是喜剧片（标签1）。我们有一个新用户，他给电影A评分为3，电影B评分为4。请问这个用户可能偏好哪种类型的电影？\n",
    "\n",
    "**数据：**\n",
    "\n",
    "| 用户   | 电影A评分 | 电影B评分 | 偏好类型 |\n",
    "| ------ | --------- | --------- | -------- |\n",
    "| 用户1  | 5         | 1         | 动作片   |\n",
    "| 用户2  | 4         | 2         | 动作片   |\n",
    "| 用户3  | 2         | 5         | 喜剧片   |\n",
    "| 用户4  | 1         | 4         | 喜剧片   |\n",
    "| 用户5  | 3         | 2         | 动作片   |\n",
    "| 用户6  | 2         | 5         | 喜剧片   |\n",
    "\n",
    "你需要做以下步骤：\n",
    "1. 构造数据\n",
    "2. 创建KNN模型\n",
    "3. 使用数据训练模型\n",
    "4. 预测新用户的喜好"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 引入核心包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "X = np.array([\n",
    "[1,1],\n",
    "[5,5],\n",
    "[5,3],\n",
    "[2,1]\n",
    "])\n",
    "\n",
    "y =np.array([0,1,1,0])  # 0表示动作片，1表示喜剧片"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 创建 KNN 模型\n",
    "k = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "knn = KNeighborsClassifier(n_neighbors=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-2 {color: black;}#sk-container-id-2 pre{padding: 0;}#sk-container-id-2 div.sk-toggleable {background-color: white;}#sk-container-id-2 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-2 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-2 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-2 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-2 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-2 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-2 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-2 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-2 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-2 div.sk-item {position: relative;z-index: 1;}#sk-container-id-2 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-2 div.sk-item::before, #sk-container-id-2 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-2 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-2 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-2 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-2 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-2 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-2 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-2 div.sk-label-container {text-align: center;}#sk-container-id-2 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-2 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">KNeighborsClassifier</label><div class=\"sk-toggleable__content\"><pre>KNeighborsClassifier(n_neighbors=1)</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=1)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn.fit(X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 用模型推理(预测)用户的喜好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "new_user = np.array([[3, 4]])\n",
    "prediction = knn.predict(new_user)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_10524/2657310789.py:12: UserWarning: marker is redundantly defined by the 'marker' keyword argument and the fmt string \"ro\" (-> marker='o'). The keyword argument will take precedence.\n",
      "  plt.plot(new_user[0,0],new_user[0,1],'ro',marker='x',markersize=8)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkYAAAHJCAYAAABg0/b8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABiCElEQVR4nO3deVxUVf8H8M+FGQaQRUUIUAR31EQRTMk9AxNTTO0xRcNdy9JcHkuzcsnHen6VaJq0oLihVqiPpplkgktaKlimRqaSiiDuiMgwwPn9MYuODMsIwzDj5/168co599xzv985lN/ucq4khBAgIiIiItiYOwAiIiKimoKFEREREZEGCyMiIiIiDRZGRERERBosjIiIiIg0WBgRERERabAwIiIiItJgYURERESkwcKIiIiISIOFERGApKQkSJIEPz+/Mvv16NEDkiQhLi6uWuKqCn5+fpAkCZIkYcOGDaX2+/XXX3X9JEmqxgjv08ZqSiNHjtTLU5IkODg4wN/fH1OnTkVWVpZJj6917NgxhIWFoXbt2ro40tPTq+XYRFQ6mbkDIKLqs379egwdOtTgtnXr1lVzNObVuXNnNG3aFACQnZ2Nw4cPIzo6Ghs3bsShQ4fKLZIr486dO+jfvz8yMzPRo0cP+Pj4QJIkODk5meyYRFQxLIyIHhOBgYH44YcfcPXqVbi7u+ttKywsxKZNm9CqVSucPXsWSqXSLDHu2bMHKpWqWo41duxYjBw5Uvf56tWrCA8Px9GjRzFjxgx8++23Jjv2kSNHcPnyZYwYMQJr1qwx2XGIyHi8lEb0mBg+fDgKCwvx9ddfl9i2e/duZGdnY/jw4WaI7L4mTZrA39/fLMd2d3fHxx9/DADYsWOHSQu0S5cuAQAaN25ssmMQ0aNhYURUBa5fv47Zs2ejdevWcHJygqurK5o3b46XX34Zv/76a4n+V69exYwZM9CiRQvY29ujTp066NOnD/bt21eir/b+p5EjRyIrKwtjx45FgwYNIJPJEB0dXeEYBwwYACcnJ4OXzNatWwdJkjBs2LAyxzh06BAiIiLg7u4OhUIBPz8/vPrqq7h8+bJev48//hiSJOGtt94qdazw8HBIkoTExERdW1n3GKWnp2PChAnw8/ODQqGAu7s7Bg8ejN9//73MmI0RGBgIAMjPz8e1a9cA3L8nKSkpCT/88AN69uypuy/o1q1bun23b9+O3r17w83NDfb29mjevDneeecd5Obm6uUgSRKioqIAAPPmzdPdX/Tg2SsAOHDgAF544QV4eHjovuvJkyfj6tWrJeKuyhi1tPfTpaenY+vWrejUqRNq1aqFunXrYujQobri7mFCCKxfvx69evXSHadx48YYNmwYDh48WKL/iRMnEBkZifr160OhUMDb2xujRo3i/VZkPoKIxN69ewUA4evrW2a/7t27CwBi1apVurY7d+6Ipk2bCgCiWbNmYuDAgWLgwIEiODhYyGQy8d577+mNcfr0aVG/fn0BQDRp0kS88MILolu3bsLOzk7Y2NiI9evXG4wtPDxcNGjQQHh6eorBgweL559/Xnz++efl5ubr6ysAiMzMTDF8+HABQPz999+67bm5ucLR0VF069ZNCCGEQqEQhv7TsHbtWmFrayskSRKdO3cWL730kmjevLkAIJ544glx+vRpXd+MjAxhY2MjGjZsKIqLi0uMdfXqVSGTyYSnp6coLCwsEevD9u/fL1xcXAQA0bp1azF48GAREhIiJEkSDg4O4qeffir3e9CKiooqMYcPxg1AABDXr1/X6z9u3DghSZLo0KGDeOmll0SHDh3ErVu3hBBCTJs2TQAQ9vb2olu3bmLgwIG6XIKCgkRubq4u76ioKNG5c2cBQLRt21ZERUWJqKgo8eWXX+riWLJkiZAkSdja2oqQkBAxePBg4e/vLwCIRo0aicuXLxvMqSpi1NL+rv/73/8WNjY24qmnnhIDBw4UPj4+ut/1vLw8vX0KCwvF4MGDBQChUChEr169xJAhQ0RISIiwt7cXUVFRev2//fZbYWdnp4th8ODBIjAwUAAQbm5u4o8//qjwvBJVFRZGRKJyhdGqVasEAPH666+X6H/lyhVx4sQJ3efCwkLx5JNPCgBiyZIlekVDSkqKcHNzE7Vq1RJXrlwpERsA8cILL4h79+4ZlduDhdGuXbsEADFv3jzd9jVr1ggAuiLLUGF04cIF4eDgIGQymdi+fbuuvaioSLzxxhsCgOjQoYPePs8884wAIPbt21cipuXLlwsA4o033jAY64Nu374tPD09hVwuF998843etsTERGFnZyfq168vlEplhb6PsgqjmJgYAUDUr1+/RH8AYuPGjSX22bRpkwAgAgMDxfnz53XtBQUFYvz48QKAmDFjht4+2t+Zh4tmIYQ4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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"User Movie Preference\", size=15) \n",
    "plt.xlabel(\"Movie A rating\")\n",
    "plt.ylabel(\"Movie B rating\")\n",
    "plt.grid()\n",
    "\n",
    "# 绘制原始样本点，要求不同的影片喜好类别用不同的颜色标记\n",
    "# 提示: 用scatter散点图绘制，用它的参数c实现不同的类别用不同的颜色标记\n",
    "plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis')\n",
    "\n",
    "# 绘制新数据点，用红色x标记，大小为8\n",
    "# 提示：用plt.plot()绘制，用它的参数marker实现不同的标记符号\n",
    "plt.plot(new_user[0,0],new_user[0,1],'ro',marker='x',markersize=8)\n",
    "\n",
    "# 新数据最近邻索引为第一个最近邻的索引\n",
    "dist, idx = knn.kneighbors(new_user)\n",
    "nearest = X[idx[0]] # 获取最近邻点的坐标，这是一个列表，第一个元素是x坐标，第二个元素是y坐标\n",
    "\n",
    "# 用红线标记新数据点与最近邻点的连接线\n",
    "# 提示：用plt.plot()绘制，用 r-- 实现红色虚线\n",
    "plt.plot([new_user[0, 0], nearest[0,0]], [new_user[0, 1], nearest[0,1]], 'r--')\n",
    "\n",
    "# 为每个点添加坐标文本  \n",
    "for x, y in zip(X[:, 0], X[:, 1]):\n",
    "    plt.text(x, y+0.1, f'({x}, {y})') \n",
    "\n",
    "# 为新数据点添加坐标文本\n",
    "plt.text(new_user[0,0], new_user[0,1]+0.1, f'({new_user[0,0]}, {new_user[0,1]})')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "movie_env",
   "language": "python",
   "name": "movie_env"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
